其他
公厕里的二进制究竟写的什么。。。
The following article is from 数据结构和算法 Author 博哥
(关注数据结构和算法,了解更多新知识)
某公厕分别用中文,英文,日语和韩语写了下面一段提示:向前一小步,文明一大步。这种提示在男厕所基本上是见怪不怪了,但关键是下面还有一段用0和1组成的数字,这又什么意思,难道是给外星人看的?
作为一个程序员能敏锐的感觉到这应该就是上面中文的二进制表示方式,于是我就尝试着把它转化为汉字,看看转换之后对不对。
我们都知道汉字在计算机中存储常见的编码有GB2312,GBK,UTF-8,但仔细观察上面的二进制会发现很多地方出现了连续的3个1,所有大胆猜测应该使用的是UTF-8编码(当然只是猜测)。
猜完之后我们再来验证下,在验证之前我们先要了解下UTF-8的实现原理。UTF-8是一种可变长字符编码,它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部分修改后,便可继续使用。
UTF-8通常使用1~4个字节表示字符,怎么确定一个字符占几个字节呢?这就和二进制的表示有关,如果是一个字节,那么最高位就是0,剩下的7个二进制可以表示128个字符,这些字符对应ASCII的128个字符。如果是两个字节会以110开头,三个字节是1110开头……。
0xxxxxxx 一个字节
110xxxxx 10xxxxxx 两个字节
1110xxxx 10xxxxxx 10xxxxxx 三个字节
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 四个字节
private static void toChinese() {
String bits = "11100101100100001001000111100101100010011000110" +
"1111001001011100010000000111001011011000010001111111001" +
"10101011011010010100100000111001101001011010000111111001" +
"10100110001000111011100100101110001000000011100101101001" +
"0010100111111001101010110110100101";
int length = bits.length();
byte[] bytes = new byte[length >> 3];
for (int i = 0; i < length; i += 8) {
String byteString = bits.substring(i, i + 8);
bytes[i >> 3] = (byte) Integer.parseInt(byteString, 2);
}
System.out.println("转换之后的结果:" + new String(bytes));
}